首先,在 FP languages 裡面(Swift 可以有多種寫法,可以是物件導向也可以是函式編程,完全取決於你的寫法),function 是 first-class citizens。
而要成為 first-class citizens 有幾樣比較重要的條件需要滿足:
1. Function 可以像其他物件一樣,你可以指派函式給變數。
2. Function 也可以接受其他 Function 當作參數去傳遞,或者回傳 Function
3. 而 Function 可以滿足第 2 點的 Function 我們又稱為 higher-order functions
所以我們今天的主題在於先介紹常用的 higher-order functions 三人組:
map 先生
filter 小姐
reduce 小孩
(以上的稱謂沒有特別的意涵)
胡適曾經說過(?)女士優先,所以我們就先從 Filter 小姐開始介紹~
在 Swift 中 filter(:) 用來處理 Collection 的型別,例如說 Array
filter 會將 Array 中的每個元素都調用出來,並將函數打進去(簡稱:拉出來,打進去),在作用後產生另一組 Array
舉例來說:
有個 fish 的 array
let tunaFamily = fish.filter { $0 == "tuna"}
在經過 filter 的作用後他會產生只有炙燒鮪魚一家的的 Array 看到這邊是不是餓了啊?
FP 有個我覺得蠻重點的點在於: 你今天想要怎麼做?
你今天除了可以叫鮪魚一家粗來丸外,如果你想要把其中的小鮮肉鮪魚叫出來帶回家,你可以怎麼做?
tunaFamily.filter {$ 0 .age < 20 }
FP 可以讓你不僅僅是去去定義一堆 funtion 和 properties 然後再去把他們組裝起來,而是可以在當下就聚焦於 " 你要怎麼處理這些funtion 和 properties " ,看要是清蒸還是紅燒,我們可以再拿到食材後馬上處理,這可以讓程式碼清晰許多。